/* eslint-disable no-undef */
// raf 兼容
// 调用方式 RAF(function(){this.loop() })
// eslint-disable-next-line no-shadow
export const RAF = cb => requestAnimationFrame(cb) || webkitRequestAnimationFrame(cb) || mozRequestAnimationFrame(cb) || oRequestAnimationFrame(cb) || msRequestAnimationFrame(cb) || function (cb) {
  setTimeout(cb, 1000 / 60)
}
// raf 节流函数
// 调用demo
// var loopFn = rafDebounce(function() {
//   滚动中的真正的操作
//   console.log(123)
// })
// 绑定监听
// window.addEventListener('touchmove', loopFn)
export const rafDebounce = fn => { // touchmove  scroll节流 高阶函数
  let ticking = false
  return () => {
    if (!ticking) {
      ticking = true
      this.RAF(() => {
        ticking = false
        fn && fn()
      })
    }
  }
}


/**
  防抖函数 demo

  事件停止 wait 毫秒后执行 func

  mustRun>0 表示启用 代表 mustRun 毫秒内，必然会触发一次 handler
  function _log() {
    console.log(1)
  }
  window.onscroll=throttle(_log,500,1000)
 * @param {Function} func 执行方法
 * @param {Number} wait 事件停止 wait 毫秒后执行 func
 * @param {Number} mustRun mustRun>0 表示 mustRun 毫秒内必然执行一次 mustRun<=0 表示不启用
*/
export function throttle(func, wait, mustRun) {
  let timeout = null
  let startTime = new Date()

  return function () {
    let context = this
    // eslint-disable-next-line prefer-rest-params
    let args = arguments
    const curTime = new Date()

    clearTimeout(timeout)
    // 如果达到了规定的触发时间间隔，触发 handler
    if (mustRun > 0 && curTime - startTime >= mustRun) {
      func.apply(context, args)
      startTime = curTime
      // eslint-disable-next-line no-multi-assign
      if (!timeout) context = args = null
      // 没达到触发间隔，重新设定定时器
    } else {
      timeout = setTimeout(() => {
        // eslint-disable-next-line no-multi-assign
        if (!timeout) context = args = null
        return func.apply(context, args)
      }, wait)
    }
  }
}
